﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 接口01
{
    class Program
    {
        static void Main(string[] args)
        {
            Food f = new Meat();
            Meat m = new Meat();
            People p = new People();
            p.Eat(m);
        }
    }

    // 当一个抽象类中的所有方法都是抽象方法的时候，这个类我们可以升级为接口
    // 接口和抽象类非常相似，都不能实例化，都可以通过指向子类的对象间接实例化，都是定义了一些没有实现的属性和方法
    // 可以把接口理解为一个类的模板，接口的最终目的就是起到统一的作用
    // 实现接口的任何类必须实现其所有的成员（属性、方法）（一个类如果想实现一个接口，那么就必须实现这个接口中的所有的方法）

    // 接口当中可以包含属性和方法，但是不能包含字段

    // 抽象类除了有抽象成员之外，还可以拥有非抽象成员，而接口中所有的成员都是抽象的
    // 接口中不能包含构造方法、析构方法、静态成员和常量
    // C#继承是单继承（所以有一些时候会不方便类的架构），但是一个类可以实现多个接口
    
    // 接口、抽象类和普通类他们三者存在递进关系：随着抽象程度的不同，而产生的三种不同形态 
    

    //abstract class Food
    //{
    //    public abstract void ByEat();
    //}

    interface Food
    {
        // 方法前面没有访问修饰符，因为接口就是让其他类去继承的，而且必须要实现该接口中所有的属性和方法
        // 接口中所有的方法和属性默认是public的，所以我们不加修饰符
        void ByEat();
        // void M();
    }
    class Meat : Food
    {
        public /*override*/ void ByEat()
        {
            Console.WriteLine("肉好吃");
        }
    }
    class Rice : Food
    {
        public /*override*/ void ByEat()
        {
            Console.WriteLine("米饭不好吃");
        }
    }

    class People
    {
        public void Eat(Food f)
        {
            f.ByEat();
        }
    }
}
